const express = require('express')
const router = express.Router()

// 导入模型
const {Cate} = require('../models')
const {
    Op
} = require('sequelize')

// 导入验证表单数据的中间件
const expressJoi = require('@escook/express-joi')
// 导入验证规则
const {
    cate_add_schema,
    cate_update_schema,
    cate_sort_update_schema
} = require('../schema/cate')


// 分类列表
router.get('/cates',(req,res)=>{
    res.render('cate/index.html')
})

// 获取分页数据
router.get('/catesApi',async (req,res)=>{
     try{
            // 接收分页参数
            const page = req.query.page || 1
            const limit =parseInt(req.query.limit || 3)
            const offset = (page - 1) * limit
            const data = await Cate.findAndCountAll({
                offset,
                limit
            })
            // 要求返回前端特定的数据格式
            return res.json({
                code:0,
                msg:'查询成功', 
                count:data.count,
                data:data.rows
            })
     }catch(e){
         console.log(e.message);
     }
    
})

// 分类添加
// 1.提供添加表单
router.get('/cates/add',(req,res)=>{
     res.render('cate/add.html')
})

// 2.添加分类名称的唯一性验证
router.get('/cates/checkAdd',async (req,res)=>{
     // 接收参数
     const cate_name=req.query.cate_name || ''
     const result=await Cate.findAll({
         where: {
             cate_name
         }
     })
     if(result.length>0){
         return res.cc(400,'分类名称重复')
     }
     return res.cc(200,'ok')
})

// 3.分类添加入库
 // 3.0 表单验证的中间件
 // 3.1 数据验证通过后， 会把这次请求流转给后面的路由处理函数
 // 3.2 数据验证失败后，终止后续代码的执行，并抛出一个全局的 Error 错误，进入全局错误级别中间件中进行处理
router.post('/cates/add', expressJoi(cate_add_schema), async (req, res) => {
      // 接收表单数据
      const data=req.body
     // 数据唯一性验证
      const result = await Cate.findAll({
          where: {
              cate_name:data.cate_name
          }
      })
      if (result.length > 0) {
          return res.cc(400, '分类名称重复')
      }
      // 数据的添加
      await Cate.create(data)
      return res.cc(200,'添加成功')
})

// 分类删除
router.delete('/cates/:id',async (req,res)=>{
    try{
       const id = parseInt(req.params.id)
       const row = await Cate.findByPk(id)
       row.destroy()
       return res.cc(200,'删除成功')
    }catch(e){
        throw new Error(e)
    }
     
})

// 分类修改

// 1.查询出要修改的分类id并展示在修改的表单中
router.get('/cate',async (req,res)=>{
    // 接收要修改的数据id
    const id=req.query.id
    // 查询该条数据
    const cate= await Cate.findByPk(id)
    // 渲染在修改表单中
    res.render('cate/update.html',{cate})
})

// 2.修改分类名称的唯一性验证
router.get('/cates/checkUpdate', async (req, res) => {
    // 接收参数
    const cate_name = req.query.cate_name || ''
    const id=parseInt(req.query.id)
    const result = await Cate.findAll({
        where: {
            cate_name,
            // 修改时有可能不修改分类名称
            id:{
                [Op.ne]:id
            }
        }
    })
    if (result.length > 0) {
        return res.cc(400, '分类名称重复')
    }
    return res.cc(200, 'ok')
})
// 3.进行数据库的修改
router.put('/cates/:id', expressJoi(cate_update_schema),async (req, res) => {
    try{
        const id = parseInt(req.params.id)
        const data = req.body
        const cate = await Cate.findByPk(id)
        cate.update(data)
        return res.cc(200,'修改成功')
    }catch(e){
        throw new Error(e.message)
    }
   
})


// 5.即点即改
  // 根据id查询数据
  router.get('/cates/getCateById',async (req,res)=>{
       const id=parseInt(req.query.id)
       const cate= await Cate.findByPk(id)
       return res.json({
           status:200,
           data:cate
       })
  })
  // 即点即改
  router.post('/cates/editSort/:id', expressJoi(cate_sort_update_schema),async (req, res) => {
       // 接收id
       const id=parseInt(req.params.id)
       // 接收修改后的排序数据
       const sort=parseInt(req.body.sort)
       await Cate.update({
           sort
       },{
           where:{
               id
           }
       })
       return res.cc(200,'ok')
  })



module.exports = router